From fcd9174e64b1f0f5f084c3d7f3c2c59c0dbf34ee Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Thu, 30 Nov 2006 18:21:50 +0000 Subject: [PATCH] [LINUX] Fix backward compatibility with hypervisors which do not support kexec. Also do not rely on side effects in BUG_ON(x) -- use if(x) BUG() instead. Signed-off-by: Ian Campbell --- .../drivers/xen/core/machine_kexec.c | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c index d4c248eccd..88a2423340 100644 --- a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c +++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c @@ -20,7 +20,7 @@ void xen_machine_kexec_setup_resources(void) { xen_kexec_range_t range; struct resource *res; - int k = 0; + int err, k = 0; if (!is_initial_xendomain()) return; @@ -32,8 +32,16 @@ void xen_machine_kexec_setup_resources(void) range.range = KEXEC_RANGE_MA_CPU; range.nr = k; - if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)) + /* + * Anything other than EINVAL or success indictates + * that we are not running on a hypervisor which + * supports kexec. + */ + err = HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range); + if (err == -EINVAL) break; + else if (err) + return; k++; } @@ -52,7 +60,8 @@ void xen_machine_kexec_setup_resources(void) range.range = KEXEC_RANGE_MA_CPU; range.nr = k; - BUG_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)); + if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)) + BUG(); res = xen_phys_cpus + k; @@ -68,7 +77,8 @@ void xen_machine_kexec_setup_resources(void) memset(&range, 0, sizeof(range)); range.range = KEXEC_RANGE_MA_XEN; - BUG_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)); + if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)) + BUG(); xen_hypervisor_res.name = "Hypervisor code and data"; xen_hypervisor_res.start = range.start; @@ -80,7 +90,8 @@ void xen_machine_kexec_setup_resources(void) memset(&range, 0, sizeof(range)); range.range = KEXEC_RANGE_MA_CRASH; - BUG_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)); + if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range)) + BUG(); if (range.size) { crashk_res.start = range.start; -- 2.30.2